/**
 * 连接数据库
 * 引入schema文件
 */
// 1.引入mongoose的连接方式
const mongoose = require('mongoose');
// 2.数据库连接的地址，ds_db：数据库的名字
const dbAddress = 'mongodb://118.25.208.36:1024/ds_db';

const glob = require('glob');

const path = require('path');

let connnectCount = 0;
// 3.导出连接函数,connect连接数据库，connection监听数据库的连接
// module.exports（类似export default）、exports(类似export)可以导出很多类型，如对象、函数等
exports.connectDb = () => {
  // 3.1连接数据库, 第二个参数剔除控制台警告
  mongoose.set('useCreateIndex', true); // 剔除控制台警告
  mongoose.connect(dbAddress, {
    useNewUrlParser: true,
  });
  
  // 对连接监听的事件用Promise进行处理
  return new Promise((resolve, reject) => {
     // 3.2监听数据库的断开连接方式
    mongoose.connection.on('disconnected', () => {
      // 连接次数小于3时，进行重新连接，否则断开，避免一直重新连接对服务资源的浪费
      if (connnectCount < 3) {
        connnectCount ++;
        mongoose.connect(dbAddress, {
          useNewUrlParser: true,
        });
      } else {
        reject();
        throw new Error('数据库出现问题-disconnected');
      }
    })
    // 3.3监听数据库的错误连接方式
    mongoose.connection.on('error', (err) => {
      // 继续练就数据库
      // 连接次数小于3时，进行重新连接，否则断开，避免一直重新连接对服务资源的浪费
      if (connnectCount < 3) {
        connnectCount ++;
        mongoose.connect(dbAddress, {
          useNewUrlParser: true,
        });
      } else {
        reject(err);
        throw new Error('数据库出现问题-error')
      }
    })
    // 3.3监听数据库连接成功，只需要连接一次就可以
    mongoose.connection.once('open', () => {
      console.log('数据库连接成功');
      resolve();
    })
  })
};

exports.initSchema = () => {
  // 使用glob引入所有的schema下的文件
  glob.sync(path.resolve(__dirname, './schema/', '**/*.js')).forEach(require);
}